マルチコア
タスクと CPU コアの割り当ては タスク設定 上のオブジェクト タブ:タスクグループ タブ。
今日のコントローラーの多くには、複数のCPUコアを搭載したプロセッサーが搭載されています。
もし CODESYS をマルチコア機能を使用せずにマルチコアコントローラで実行すると、タスクの分散はオペレーティングシステムのスケジューラによって処理されます。これは、アプリケーションが複数のタスクで実行される場合に当てはまります。この場合、タスクの配分には直接影響しません。負荷分散によっては、タスクを異なる CPU コアで実行することもできます
と CODESYS マルチコア機能を使用すると、取得した CPU コアの数を考慮して、IEC タスク自体を専用の CPU コアに割り当てることができます。これにより、パフォーマンスが向上します。この目的のために、IEC プログラムを複数のタスクに分割する必要があります。
には 2 つの基本的な異なる戦略があります CODESYS IEC タスクを CPU コアに分散するには:
CPU コアにリンクされて固定されている IEC タスク:
タスクは常にこの特定の CPU コアで実行されます。複数のタスクをグループ化することで、1 つの CPU コアにリンクできます。これは、IEC プログラムがまだ複数の CPU コアで同時に実行できない場合などに便利です
IEC タスクはすべての CPU コアで実行されます。
オペレーティング システムは、CPU コア上のグループの 1 つ以上のタスクの分散を制御します。
重要
IEC タスクが複数の CPU コアに分散されると、IEC プログラムの動作に一部の変更が生じるため、それを考慮する必要があります。
IEC タスクを優先的に処理することはもはや当たり前のことではありません。タスクが優先度順に処理されるのは、タスクが 1 つの CPU コアにまとめられている場合だけです
最高優先度の IEC タスクのデータのサイクル一貫性は保証されなくなりました。したがって、サイクル中に値を変更しない場合は、IEC タスク サイクルの開始時にデータをローカルにコピーする必要があります。
すべてのタスクには、タスクが動作する共有プロセスイメージがあります。
ReadInputs()
関数は各タスクの開始時に呼び出され、WriteOutputs()
関数は最後に呼び出されます。その結果、IPOモデルは各タスクに個別に適用されます。これらの関数は共有プロセスイメージを読み書きします。プロセスイメージも物理的に書き込まれ、パケットはバスサイクルタスクが呼び出されたときにのみ送信されます。ただし、バスサイクルタスクは各呼び出しを待機します。WriteOutputs
そしてReadInputs
タスクの。これにより、バス サイクル タスク内でのデータの一貫性が確保されます。出力は 1 つのタスクにのみ割り当てることができます。
入力は複数のタスクに割り当てることができますが、直接アクセスすることは避けてください。入力は、アトミック操作によってタスクのローカル変数に書き込む必要があります。
2 つ目のタスク。以下のようにプロセスイメージを更新します。
ReadInputs()
最初のタスクと並行して、実行中の最初のタスクの入力も更新します。その結果、タスクのデータの一貫性は、最も優先度の高いタスクのシングルコアでのみ保証されます。
詳細については、以下を参照してください。 バスサイクルタスク
コンシステントカウンタ (インクリメンタ、デクリメンタ) の場合、アトミック外部ライブラリ関数
SysCpuAtomicAdd()
常に使用してください (詳細については、を参照してください)SysCpuHandling.library
)。
重要
データの一貫性
ビットアクセス (データ型)
BIT
) が IEC プログラムのマルチコア CPU で一貫して (アトミックに) 処理されない。そのためには、外部ライブラリ関数を使用することをおすすめしますSysCpuTestAndSetBit()
。(詳細については、以下を参照してください。SysCpuHandling.library
)32 ビット幅までの単純なデータ型 (
BOOL
、BYTE
、WORD
/INT
、DWORD
/DINT
など) は、マルチコア CPU 上の IEC プログラムでも一貫して (アトミックに) 処理されます。64 ビットのデータ型 (
LINT, LWORD, LREAL)
64 ビット システムおよびマルチコア システムのみの IEC プログラムで一貫して (アトミックに) 処理されます。これを行うために、特別な予防措置を講じる必要はありません。複雑なデータ型にアクセスするには (
STRING
、FB
、STRUCT
、およびARRAY
)、同期/整合性の調整は自分で行う必要があります。タスク設定で、 変数の使用法 タブでは、IEC タスク内の変数に読み取りアクセス権と書き込みアクセス権のどちらを与えるかを定義できます。
マルチコア システムでは、「メモリの並べ替え効果」が発生する可能性があります。詳細については、「IEC オペレータ」を参照してください。
__MemoryBarrier()
。
複数のプロセッサコアへのタスクの分散
要件:アプリケーションには少なくとも 2 つのタスクが定義されています。次に例を示します。 MainTask
(IEC タスク) と LowTask
(IEC タスク)。
を開く タスク設定 エディター内のオブジェクト。
に切り替える タスクグループ タブ。
概要にはデフォルトが表示されます IEC-タスク タスクグループ。
クリック [グループを追加] 新しいタスクグループを追加します。
ザル
NewGroup
グループが追加されました。グループ名をダブルクリックします
NewGroup
そして、次のように変更します。LowGroup
。で コア、課題を選択してください (例 1)。
タスクを開く
LowTask
(IEC タスク) がエディタに表示されます。で タスクグループ、新しいグループを選択します。
LowGroup
。ザル
LowTask
このタスクはプロセッサコア 1 のグループメンバシップにより、現在プロセッサコア 1 によって処理されています。LowGroup
。
トレース内のプロセッサコアあたりのプロセッサ負荷の表示
で CODESYSでは、プロセッサの負荷をビジュアライゼーションで表示できます。 デバイストレース オブジェクト。
プロジェクト内でデバイス トレースが表示される方法の詳細については、次を参照してください。 コントローラーのすべてのトレースへのアクセス